package web.mb;

import java.text.ParseException;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;


import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import metier.entities.Client;
import metier.entities.ClientAbonnement;
import metier.entities.Declaration;
import metier.entities.Employe;
import metier.entities.Etat;
import metier.entities.Message;
import metier.entities.Offre;
import metier.entities.Paiement;
import metier.entities.Pays;
import metier.entities.StatutLivraison;
import metier.entities.Utilisateur;
import metier.entities.Ville;
import metier.sess.IDeclarationLocal;
import metier.sess.IMessageLocal;
import metier.sess.IOffreLocal;
import metier.sess.IPaiementLocal;
import metier.sess.IPaysLocal;
import metier.sess.IStatutLivraisonLocal;
import metier.sess.IUtilisateurLocal;

@ManagedBean
@ViewScoped
public class EspaceUsersMB {
	
	@EJB
	private IDeclarationLocal metierDec;
	
	@EJB
	private IOffreLocal metier;
	
	@EJB
	private IUtilisateurLocal metierUtilisateur;
	
	@EJB 
	private IPaiementLocal metierPaiement;
	
	
	@EJB
	private IMessageLocal metierMessage;
	
	@EJB
	private IStatutLivraisonLocal metierStatutLivraison;
	
	static private Integer Id;
	static private Integer IdS;
	static private Integer IdC;
	
	@ManagedProperty(value="#{loginnMB}")
    loginnMB login;
	
	@ManagedProperty(value="#{infoOffreMB}")
	InfoOffreMB infmb;
	
	
	private static StatutLivraison a;
	
	
	private static String ope="";
	
	private static List<Etat> listeEtat;
	private static List<Ville> listeVille;
	
	
	/*private Client c=(Client) metierUtilisateur.getUtilisateur(login.C.getIdUtilisateur());
	
	

	public Client getC() {
		return c;
	}

	public void setC(Client c) {
		this.c = c;
	}*/

	
	
	

	public StatutLivraison getA() {
		return a;
	}

	public  Integer getId() {
		return Id;
	}

	public  void setId(Integer id) {
		Id = id;
	}

	public  Integer getIdS() {
		return IdS;
	}

	public  void setIdS(Integer idS) {
		IdS = idS;
	}

	public  Integer getIdC() {
		return IdC;
	}

	public  void setIdC(Integer idC) {
		IdC = idC;
	}

	public String getOpe() {
		System.out.println("set"+ope);
		return ope;
	}

	public void setOpe(String ope) {
		this.ope = ope;
	}

	public void setA(StatutLivraison a) {
		this.a = a;
	}

	

	public loginnMB getLogin() {
		return login;
	}

	public void setLogin(loginnMB login) {
		this.login = login;
	}

	
	
	public InfoOffreMB getInfmb() {
		return infmb;
	}

	public void setInfmb(InfoOffreMB infmb) {
		this.infmb = infmb;
	}

		//Espace Expéditeur
		//liste des offres
		public List<Offre> listeOffres()
		{
			//liste des offres actifs
					return metier.listeOffre(1,login.C.getIdUtilisateur(),0);
		}
		
		//liste des messages recu par un client
		public List<Message> listeMessages()
		{
			Client c=(Client) metierUtilisateur.getUtilisateur(login.C.getIdUtilisateur());
			return c.getListeMessagesRecu();
		}
		
		//liste des déclarations
		public List<Declaration> listeDeclaration(Integer Type,String typeuser)
		{
			return metierDec.getAllDeclarationActivePrUser(login.C.getIdUtilisateur(),typeuser,Type);
		}
		
		
		
		//accept a bid
		public String accepterDeclaration(Integer idDec) throws ParseException
		{
		     //récupérer la déclaration en question 
			Declaration dec=metierDec.getDeclaration(idDec);
			Offre o=dec.getOffre();
			if(login.C.getTranExp().compareTo("Exp")==0)
			{
				System.out.println("Exp");
			//l'expéditeur a accepté la declaration
				
			//////////////neww code///////////////////////
				Paiement p=metierPaiement.getPaiementByDeclaration(idDec, "Accept Bid", login.C.getIdUtilisateur());
				
				if(p!=null)
				{
					if(!p.getStatutPaiement())
					{
						FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "your paiement is not confirmed yet please contact the administrator"));
				     	return "here";   
					}
				}
				else
				{
					//tester si l'utilisateur est abonné
			    	int i=0;
			    	Client c=(Client)metierUtilisateur.getUtilisateur(login.C.getIdUtilisateur());
			    	List<ClientAbonnement> abon=c.getCABs();
			    	
			    		for(i=0;i<abon.size();i++)
			    		{
			    			if(((abon.get(i).getDateDebut().compareTo(new Date()))<=0) && ((abon.get(i).getDateFin().compareTo(new Date()))>=0)  )
			    			{
			    	    	   break;
			    	      	   
			    			}
			    		}
			    		if( (i>=abon.size()) || (i==0) )
			    		{
			    			
			    			return infmb.payaccept(dec);
			    		
			    		}
			    		else
			    		{
			    			dec.setStatutAccept(dec.getStatutAccept()+"E");
			    			metierDec.updateDeclaration(dec);
			    			Message m=new Message("bid accept", ((Employe)metierUtilisateur.getUtilisateur(34)),dec.getTransporteur(),"the shipper accepted your bid please accepte the bid "+dec.getIdDeclaration(), new Date());
			    		   metierMessage.addMessage(m);
			    		   return "AcceptBid.xhtml";
			    		}
				}
				
		   //////////////////////////////////////////////
			
			//envoyer un message au transporteur
			/*String message="";
			if(dec.getStatutAccept().length()==2)
			{
				//modifier le statut de la declaration en accepted 2
				message="your quote is accepted"+idDec;
				dec.setStatut(2);
				metierDec.updateDeclaration(dec);
				//ajouter la déclaration gagante à l'offre
				o.setDecGanante(dec);
				metier.updateOffre(o);
				
			}
			else
			{
				System.out.println("#2Exp");
				dec.setStatutAccept(dec.getStatutAccept()+"E");
				metierDec.updateDeclaration(dec);
				System.out.println("Exp"+dec.getStatutAccept());
				message="the shipper accepted your bid please accepte the bid "+idDec;
			}
			Message m=new Message("bid accept", ((Employe)metierClient.getUtilisateur(34)),metierDec.getDeclaration(idDec).getTransporteur(),message, new Date());
			metierMessage.addMessage(m);
			*/
			}
			else
			{
				
				
				
				////////////////////////////////////////new code/////////////////////////////////////
				
				//tester si l'expéditeur a accepté
				if(dec.getStatutAccept().length()==0)
				{
					FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "the shipper doesn't accept the bis yet"));
					return "gh";
			     	
				}
				else
				{
					
					Paiement p=metierPaiement.getPaiementByDeclaration(idDec, "Accept Bid", login.C.getIdUtilisateur());
					if(p!=null)
					{
						if(!p.getStatutPaiement())
						{
							FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "your paiement is not confirmed yet please contact the administrator"));
					     	return "here";   
						}
					}
					else
					{
						//tester si l'utilisateur est abonné
				    	int i=0;
				    	Client c=(Client)metierUtilisateur.getUtilisateur(login.C.getIdUtilisateur());
				    	List<ClientAbonnement> abon=c.getCABs();
				    	
				    		for(i=0;i<abon.size();i++)
				    		{
				    			if(((abon.get(i).getDateDebut().compareTo(new Date()))<=0) && ((abon.get(i).getDateFin().compareTo(new Date()))>=0)  )
				    			{
				    	    	   break;
				    	      	   
				    			}
				    		}
				    		//si l'utilisateur n'est pas abonné (temporaire)
				    		if( (i>=abon.size()) || (i==0) )
				    		{
				    			
				    			return infmb.payaccept(dec);
				    		
				    		}
				    		//si l'utilisateur est abonné
				    		else
				    		{
				    			
				    			dec.setStatut(2);
				    			metierDec.updateDeclaration(dec);
				    			Offre ofr=dec.getOffre();
				    			ofr.setDecGanante(dec);
				    			metier.updateOffre(ofr);
				    			Message m=new Message("bid accept winner bid", ((Employe)metierUtilisateur.getUtilisateur(34)),dec.getOffre().getExpediteur(),"the winner bid is "+dec.getIdDeclaration()+" for the offer  "+dec.getOffre().getTitre(),new Date());
				    		   metierMessage.addMessage(m);
				    		   Message m1=new Message("bid accept winner bid", ((Employe)metierUtilisateur.getUtilisateur(34)),dec.getTransporteur(),"the  bid bnr "+dec.getIdDeclaration()+"is the winner  for the offer  "+dec.getOffre().getTitre(),new Date());
				    		   metierMessage.addMessage(m1);  
				    		}
					}
					
					
					
					
				}
				
				
				
				
				////////////////////////////////////////////////////////////////////////////////////
				
				//envoyer un message au transporteur
				/*String message="";
				if(dec.getStatutAccept().length()==2)
				{
					System.out.println("2Tran");
					message="the quote the winner"+idDec;
					dec.setStatut(2);
					metierDec.updateDeclaration(dec);
					//ajouter la déclaration gagante à l'offre
					o.setDecGanante(dec);
					metier.updateOffre(o);
				}
				else
				{
					System.out.println("#2Tran");
					//l'expéditeur a accepté la declaration
					dec.setStatutAccept(dec.getStatutAccept()+"T");
					metierDec.updateDeclaration(dec);
					message="the carrier accepted your bid please accepte the bid "+idDec;
					
				}
				//envoyer un message au transporteur
				Message m=new Message("bid accept", ((Employe)metierClient.getUtilisateur(34)),metierClient.getUtilisateur(metierDec.getDeclaration(idDec).getOffre().getExpediteur().getIdUtilisateur()),message, new Date());
				metierMessage.addMessage(m);*/
				
			}
			
		return "a";
			//
		}
		
		//refuser une déclaration
	/*	public String refuser(Integer idDec)
		{
		    Declaration dec=metierDec.getDeclaration(idDec);
		    Offre o=dec.getOffre();
		    dec.setStatut(3);
		    metierDec.updateDeclaration(dec);
		    String mssg="the bid "+idDec+" is declined";
		    //envoyer un message au transporteur
		    Message m=new Message("declined bid", ((Employe)metierClient.getUtilisateur(34)), dec.getTransporteur(), mssg, new Date());
		    //envoyer un message à l'expéditeur
		    Message m2=new Message("declined bid", ((Employe)metierClient.getUtilisateur(34)), dec.getOffre().getExpediteur(), mssg, new Date());
		    metierMessage.addMessage(m);
		    metierMessage.addMessage(m2);
		  //ajouter la déclaration gagante à l'offre
			o.setDecGanante(null);
			metier.updateOffre(o);
			return "here";
			
		}*/
		
	//liste des paiements
		public List<Paiement> listePaiement()
		{
		return metierPaiement.listePaiementPerUser(login.C.getIdUtilisateur());
		}
		
   //permet de modifier le statut du statut de livraison en booked
		
	public String booked(Integer IdDec)
	{
		//recupérer la déclaration par id
		Declaration dec=metierDec.getDeclaration(IdDec);
		Offre o=dec.getOffre();
		if(login.C.getTranExp().compareTo("Tra")==0)
		{
			//tester si le statut de  l'offre est -2 c'est à dire si l'expediteur a changer le statut de l'offre en booked
			if(o.getStatutOffre()!=-2)
			{
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "You can't booke this shipment until it's booked by the shipper"));
		     	return "a";
			}
			else
			{
				Uniqid u=new Uniqid();
				String id=u.uniqid("M", false)+o.getIdOffre();
				StatutLivraison s=new StatutLivraison(dec,id, o.getVilleDepart(), o.getCode_Postal_Depart(), o.getRue_Depart(),o.getVilleArrive(), o.getCode_Postal_Arrive(), o.getRue_Arrive(),null,null, null, null,2,new Date());
			   
				metierStatutLivraison.addStatutLivraison(s);
			   o.setStatutOffre(2);
			   dec.setIDVoyage(id);
			   metierDec.updateDeclaration(dec);
			   metier.updateOffre(o);
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "the shipment is booked now"));
		     	return "bookedOffres";
			}
		}
		else
		{
			o.setStatutOffre(-2);
			metier.updateOffre(o);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "the shipment is booked now"));
	     	return "gh";
		}
		
		
		
	}
	
	//liste des offres booked
	public List<StatutLivraison> listeStatutLivraison(Integer statut )
	{
		return metierStatutLivraison.listeStatutLivraisonUserStatut(login.C,statut);
	}
	
	
	   //permet de modifier le statut du statut de livraison en loaded
	public String loaded(Integer IdStatut)
	{
		StatutLivraison  s=metierStatutLivraison.getStatutLivraison(IdStatut);
		Offre o=s.getDeclaration().getOffre();
		if(login.C.getTranExp().compareTo("Exp")==0)
		{
			
			if(o.getStatutOffre()!=-3)
			{
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "the shipment is not loaded by the carrier!please wait until it's loaded by carrier"));
	     	System.out.println("loaded");
			return "gh";
			}
			else
			{
				o.setStatutOffre(3);
				metier.updateOffre(o);
				return "LoaderOffers.xhtml";
			}
		}
		
		else
		{
			 a=metierStatutLivraison.listeStatutLovraisonIDVStatut(s.getIDVoyage(), 3);
			if(a==null)
			{
				ope="Add";
			}
			else
			{
				ope="update";
			}
			System.out.println(ope);
			return "ShipmentInfo.xhtml";
			
		}
		
	}
	
	
	
	//permet d'ajouter ou de modifier les informations sur 
	
//liste des pays
	public List<Pays> getListPays()
	{
		return meteirp.getAllPaysActive();
	}
	
	
	 public void onCountryChange() {
		 
	        if(IdC!=0)
	        {
	        	System.out.println("ici"+IdC);
	        	listeEtat=meteirp.getPays(IdC).getListEtat();
	        }
	        else
	        {
	        	System.out.println("iciNo");
	        	listeEtat=null;
	        }
	    }
	

}
